#!/usr/bin/env python
# coding: utf-8

# In[1]:


import pandas as pd 
import pymysql

# 获取用户信息
try:
    conn = pymysql.connect(host="localhost", user="test", passwd="123456", db='course', charset="utf8")
    cursor = conn.cursor()
    print("数据库连接成功！")
except Exception as e:
    print(e)

sql1 = 'select * from 6_task_training_loginfo;'  
sql2 = "select * from 6_task_training_userupdate;"
sql3 = "select * from df_master;"
try:
    cursor.execute(sql1)
    res = cursor.fetchall()
    cols = [cursor.description[i][0] for i in range(len(cursor.description))]
    df_log = pd.DataFrame(res, columns=cols)
    
    cursor.execute(sql2)
    res = cursor.fetchall()
    cols = [cursor.description[i][0] for i in range(len(cursor.description))]
    df_update = pd.DataFrame(res, columns=cols)
    
    cursor.execute(sql3)
    res = cursor.fetchall()
    cols = [cursor.description[i][0] for i in range(len(cursor.description))]
    df_master = pd.DataFrame(res, columns=cols)
    print("数据获取成功！")
    cursor.close()
    conn.commit()
    conn.close()
except Exception as e:
    print(e)
    

import argparse
import numpy as np

# 初始化参数构造器
parser = argparse.ArgumentParser()

# 在参数构造器中添加两个命令行参数
parser.add_argument('--filename', type=str,default="分组聚合数据")

# 获取所有的命令行参数
args = parser.parse_args(args=[])
#args=[]

filename = args.filename # 文件名


# In[7]:


# 预处理用户更新数据
df_update.drop_duplicates(inplace=True)  # 去重

# 用户修改数目
cat = df_update.groupby(by="Idx")[["UserupdateInfo1"]].agg("nunique")

# 日期格式处理
df_update["ListingInfo"] = pd.to_datetime(df_update["ListingInfo"])
df_update["UserupdateInfo2"] = pd.to_datetime(df_update["UserupdateInfo2"])


# In[77]:


agg_lst = []
temp = df_update.Idx.value_counts()
for i in list(temp.index):
    df_i = df_update[df_update["Idx"] == i][["ListingInfo", "UserupdateInfo2"]] # 当前用户数据
    df_i = df_i.drop_duplicates(ignore_index=True) # 去重
    df_i = df_i.sort_values(by="UserupdateInfo2", ascending=True) # 排序-升序
    
    # 判断条件：若当前用户的修改日期只有一个，则求第一次修改日期与放款日期之间的间隔天数，并令最后一次也等于首次
    # 若当前用户的修改日期有多个，则按升序将第一个当成首次修改日期，最后一个当成最后一次修改日期，并求间隔天数
    if len(df_i) <= 1:
        
        # 最早修改日期
        first_update = int(str(df_i.loc[0,"ListingInfo"] - df_i.loc[0,"UserupdateInfo2"]).split()[0])
        
        # 最晚修改日期
        last_update = first_update
        agg_lst.append([i, first_update, last_update, len(df_i)-1])
    else:
        first_update = int(str(df_i.loc[0,"ListingInfo"] - df_i.loc[0,"UserupdateInfo2"]).split()[0])
        last_update = int(str(df_i.loc[len(df_i)-1,"ListingInfo"] - df_i.loc[len(df_i)-1,"UserupdateInfo2"]).split()[0])
        agg_lst.append([i, first_update, last_update, len(df_i)-1])


# In[86]:


#first_update:首次更新信息日期距离放款日期的天数；last_update：最晚修改日期距离放款日期的天数；age：首次之后又修改了多少天；
df_update_new = pd.DataFrame(agg_lst, columns=["Idx", "first_update", "last_update","age"]).sort_values(by='Idx', ascending=True,ignore_index=True)
df_update_cat = df_update_new.merge(right=cat,left_on="Idx", right_on="Idx").rename(columns={"UserupdateInfo1":"update_cats"})


# In[90]:


df_master = df_master.merge(right=df_update_cat, left_on="Idx", right_on="Idx") # 合并主表和用户修改信息的新特征表


# In[120]:


# 处理用户登陆信息

# 日期格式处理
df_log["ListingInfo"] = pd.to_datetime(df_log["ListingInfo"])
df_log["LogInfo3"] = pd.to_datetime(df_log["LogInfo3"])


# In[98]:


# 计算用户总的登陆类型数目
cat_log = df_log.groupby(by="Idx")[["LogInfo2"]].agg("nunique").rename(columns={"LogInfo2":"LogInfo2_cat"})


# 统计用户登陆天数
agg2_lst = []
temp2 = df_log.Idx.value_counts()
for i in list(temp2.index):
    df_i = df_log[df_log["Idx"] == i][["ListingInfo", "LogInfo3"]] # 当前用户数据
    df_i = df_i.drop_duplicates(ignore_index=True) # 去重
    df_i = df_i.sort_values(by="LogInfo3", ascending=True) # 排序-升序
    agg2_lst.append([i, len(df_i)])


# In[117]:


df_log_new = pd.DataFrame(agg2_lst,columns=["Idx", "Days"]).sort_values(by="Idx")
df_log2 = df_log_new.merge(right=cat_log, left_on="Idx", right_on="Idx")
df_master = df_master.merge(right=df_log2, right_on="Idx", left_on="Idx")


# In[119]:


# 写入数据库
import pymysql
from sqlalchemy import create_engine
host = "localhost"
user = "root" # 用户名
passwd=""  # 密码
db='course' # 数据库名
engine = create_engine(f"mysql+pymysql://{user}:{passwd}@{host}/{db}?charset=utf8")
df_master.to_sql("df_master_with_update_log", con=engine, if_exists="replace", index=False)

